package com.wjw.java.others.string_;

/**
 * String对象用于保存字符串,也就是一组字符序列,"字符串常量对象",是用双引号括起来的字符序列
 * 字符串的字符使用Unicode字符编码,一个字符占2个字节(不区分字母还是汉字)
 * String的字符串值保存在private final char value[];中
 * value是一个字符数组,使用final修饰,可以修改该数组中的值,但不能重新指向一个地址值
 * -----------------------------------------------------------------------------------
 * 创建String对象的两种方式：
 * 1.直接创建：
 * 2.调用构造器创建：
 */
public class String_ {

    public static void main(String[] args) {
        //String的字符串值保存在private final char value[];中
        final char value[] = {'a','b','c'};
        value [0] = 'A';//可以修改该数组中的值
        char value2[] = {'d','e','f'};
        //value = value2;//报错,不能重新指向一个地址值

        /**
         * 直接创建：先从常量池查看是否有"aaa"的数据空间,
         * 如果有,直接指向
         * 如果没有,则新建,然后指向
         * str最终指向的是常量池的地址
         */
        String str = "aaa";
        /**
         * 构造器创建：先在堆中开辟空间,里面维护了value属性,指向常量池的"aaa"数据空间
         * 如果有,则通过value直接指向
         * 如果没有,则新建,然后通过value指向
         * str2最终指向的是堆中的地址
         */
        String str2 = new String("aaa");
        System.out.println(str.equals(str2));//true
        System.out.println(str == str2);//false
        /**
         * intern()方法,最终返回的是常量池的地址
         * 如果常量池中有"aaa",则直接返回常量池中"aaa"的引用地址
         * 如果常量池中没有"aaa",则将"aaa"加入常量池,并返回"aaa"的引用地址
         */
        System.out.println(str == str2.intern());//true：str和str2.intern()都是常量池的地址
        System.out.println(str2 == str2.intern());//false：str2堆中的地址,str2.intern()是常量池的地址
    }
}
